\chapter{概述}

本章主要介绍了研究背景、相关技术的概念和发展情况，以及智能家居设备的发展现状，包括架构和对目前相对比较成熟的智能家居产品——苹果 HomeKit 的对比和分析。最后给出本系统的需求分析和研究难点分析。

\section{研究背景}

智能家居的出现，是为了满足人们对居住条件的越来越高的需求。最早的智能家居，是开始于1948年在美国康涅狄格州建立的“智能建筑”。随着物联网技术的出现和发展，尤其是传感器技术和嵌入式技术的快速发展，智能家居的研究、开发、使用门槛都在不断降低。

\section{Docker\ 容器技术}

Docker 容器技术是近两年来新兴的一种全新的虚拟化技术，设计的目是简化程序的开发、测试以及部署过程。通过 Docker，开发者可以将应用打包（pack）到容器中运行，还可以将容器快速迁移到任何可以运行 Docker 的设备上，打破了以往不同的操作系统、内核环境，甚至是设备处理器所支持的指令集等原因造成的程序迁移困难等障碍。

Docker在容器的基础上，进行了从文件系统、网络互联到进程隔离等方面的进一步封装，极大的简化了容器的创建和维护过程，使得 Docker比传统虚拟机更为轻便。传统虚拟机技术是虚拟出一套硬件后，在其上运行一个完整操作系统，在该系统上再运行所需应用进程；而容器内的应用进程直接运行于宿主的内核，容器内没有自己的内核，也没有进行硬件虚拟。所以容器要比传统虚拟机更为轻便，对设备的性能要求更低（可以说是基本没有硬件要求），非常适合部署到嵌入式设备上运行各种服务。

本系统就是利用了 Docker 技术的这个优点，将通信组件应用程序通过Docker容器技术封装成独立的服务，将组件以微服务的形式提供给上层设备逻辑微服务的开发人员。

\section{微服务}

微服务的核心设计理念是单一职责原则，也就是说, “把因相同原因而变化的东西聚合到一起，而把因不同原因而变化的东西分离开来。”（%此处要有引用%）

因此,根据模块功能也就是业务的边界来确定一项服务的边界，这样就很容易确定某个功能的代码应该放在哪里。而且由于具体的服务专注于某个边界之内，因此可以避免由于代码库过大衍生出的难以维护、无法定位出错位置、迭代升级困难等问题。

基于微服务的思想，在设计智能家居系统的过程中，将处理设备动作、传感器信息等等的逻辑模块和处理设备之间互联、设备与微服务注册中心互联、设备与前台界面交互的通信组件模块分离，开发单独的通信服务，供给不同类型的设备使用。

这种开发模式，可以在最大程度上减小后期调试所花的时间，出现问题的时候，可以快速确定到异常代码的具体位置。此外，也可以简化整个部署过程，实现一次部署，到处运行的目的。

\section{RESTful API}

REST 即“表述性状态转移”，是一种网络服务开发的架构风格。

RESTful API 有两个区别于其他风格的 API 的特点：
\begin{enumerate}
	\item 所有资源都可以用 URI 来表示和定位。只需要获得某个资源的 URI，就可以对该资源进行访问和处理。而物联网中的家居设备，以及上面运行的通信组件，逻辑组件等等，可以抽象成资源，用 URI 去表示他们。

	\item 可以使用 HTTP 同一接口处理客户端和服务端之间转移操作，将资源的操作抽象成 GET，PUT，POST，DELETE 等几个有限的操作，要向资源传输的数据可以包装到请求消息体当中，而资源返回的数据可以包装到响应消息体当中进行传输。
\end{enumerate}

本系统中，应用 RESTful API 来解决跨设备之间的互联问题，以及，通过提出 RESTful 请求的方式向注册中心获取目标设备的 URI地址。

\section{JSON 数据格式}
JSON，全称 JavaScript Object Notation，也就是 JS 对象标记，是随着 web 开发技术发展以及 JavaScript 语言的兴起而逐渐流行的一种数据格式。虽然名字上与JavaScript有着千丝万缕的关系，但它用完全独立于编程语言的文本格式对数据进行表示和储存。

\subsection{优点}
JSON 和 XML 都是进行网络服务开发的过程中最常用到的数据传输格式，相比于传统的、重型的XML，JSON 拥有以下几个技术优点：
\begin{itemize}
	\item 语法比 XML 更加简洁，摆脱了繁琐的尖括号的束缚，更加容易阅读。
	\item 没有冗余的结构上的字符，编码难度更低。
	\item 有效数据率。JSON 没有像 XML 那样需要严格的闭合标签，因此有效数据量与总数据包比率大大提升，可以有效降低网络传输的压力，在资源不那么充足的场景下更具优势。
\end{itemize}

第三点优点也正是在本系统中选择用 JSON 而不是 XML 进行数据传输的主要原因。

\subsection{语法规则}
\begin{enumerate}
	\item原子数据（最小的数据结构）是键值对的形式。
	\item 两条数据之间采用英文逗号作为分隔符。
	\item 花括号（\{\}）用于表示和分隔一个完整的 json 对象。
	\item 方括号（[]）用于保存数组。
\end{enumerate}
\subsection{术语约定}
本系统的应用程序采用 JSON 作为数据传输的主要格式。下文中，JSON 对象、JSONObject、JSON 格式数据均用于指示用一对花括号包含起来、符合以上四条语法规则的键值对集合；JSON数组、JSONArray，如没有特别说明，则特指包含了多个 JSON 对象的数组。
\section{现状与需求分析}
\subsection{智能家居的研究及发展现状}

国外方面，智能家居的概念从刚出现开始，就受到了欧美发达国家的高度重视，各个国家纷纷出台了促进智能家居发展的政策措施，松下、IBM、通用 等科技巨头均建立了针对智能家居的子公司，发展自己的智能家居业务。

至于国内方面，智能家居技术仍然处于起步阶段，虽然随着物联网技术的崛起和国家“互联网+”政策的推动，越来越多的厂商开始涉足这个行业，然而对于大多数人来说，还都只是一个还没实现的概念，而现在智能家居设备兼容性不好、技术不成熟、不稳定等问题也使消费者望而却步。

\subsection{同类产品分析}

国内的传统家电公司比如海尔、TCL以及新兴互联网公司小米、腾讯、阿里巴巴等等均推出过智能家居产品，其中以海尔推出的、可以实现不同品牌智能家居设备的互联的 U+智能家居产品以及小米与供应链企业合作开发的米家品牌智能家居产品最受关注。

国外方面，亚马逊的 echo 硬件和苹果的 HomeKit 发展最为成熟。其中，亚马逊的产品是和自己的语音助手、亚马逊云服务一起构成了完整的技术生态链，而 echo 则是智能家居的中枢性硬件产品，负责实现对家居设备的控制和交互。苹果 HomeKit 则选择了截然不同的发展模式，旨在跨过云端的“控制器”，实现设备端到端的直接互联，而运行 iOS 系统的设备，只是作为一个下达命令的工具，数据的传输与云端服务器、与苹果都没有直接联系，回应了好事者关于数据上传到厂商的云服务会导致隐私问题的猜测。

苹果 HomeKit 的这种比较新颖的、端对端的家具设备互联设计概念，也是本系统的重要参考对象。

\subsection{需求分析}
一个完整的，可以部署在智能家居设备中的通信组件至少需要实现以下几部分功能：

\begin{enumerate}
	\item 与同一设备的逻辑容器的数据交互。
	\item 跨设备容器交互：也就是与其他设备的通信组件的数据交互
	\item 与微服务注册中心的交互：能够发起请求通过注册中心发现目标设备
	\item 与前端的交互和数据通信：用户可以通过前端界面定义场景，前端程序会将定义好的场景信息发送到相关设备，所以作为设备中的通信模块，需要正确接收来自前端的信息并作出处理。
\end{enumerate}

\section{研究难点分析}

\begin{enumerate}
	\item 同一 Docker Daemon 下跨容器通信的问题。在 Docker 的设计中，每一个容器都是独立的网络环境，即使是同一主机中的两个容器，在默认情况下都是不能相互访问的。此外，容器在每一次重启时可能会被分配不同的 IP 地址，正因为这个原因，在同一 Docker Daemon 下面用 REST API 的方式进行通信也几乎是不可能的。而且，在同一主机中建立 HTTP 连接的方式进行通信相对而言也是非常低效率的。因此需要一种更加高效、相对底层的通信方式。
	\item 如何将代码完整部署到 Docker 容器中运行。按照以往程序开发的经验，在物理操作系统上进行程序的开发，只需要按照教程配置到运行环境，安装 IDE（集成开发环境）就可以进行开发，导入第三方运行库时也非常的简便。
	\item 至于 Docker，虽然在 DockerHUB 中提供了很多不同的集成了编程语言运行环境的镜像可供使用，但基于公版镜像运行的每一个容器都是“纯净”的、没有 GUI 的最小系统环境，这就意味着，在容器的基础上配置环境变量、添加的运行库等内容，不会影响其他容器。要想使最后开发出来的通信组件更具备泛用性，基于官方镜像定制自己的镜像是必须要做的事情。
\end{enumerate}